import { Component, OnInit, ViewChild } from '@angular/core';
import { apiConf } from '@conf/api.conf';
import { cacheConf } from '@conf/cache.conf';
import { SFComponent, SFUISchema, SFSchema, SFUploadWidgetSchema, SFDateWidgetSchema, SFCheckboxWidgetSchema } from '@delon/form';
import { _HttpClient } from '@delon/theme';
import { EACacheService, EAEnvironmentService } from '@shared';
import { NzModalRef } from 'ng-zorro-antd/modal';
import { NzUploadFile } from 'ng-zorro-antd/upload';
import { Observable, Observer, of } from 'rxjs';
import { map } from 'rxjs/operators';
import { UsermanageService } from '../../../services/usercenter.service';

@Component({
  selector: 'app-car-add-driver',
  templateUrl: './add-driver.component.html',
  styleUrls: ['./add-driver.component.less']
})
export class CarSettleAddDriverComponent implements OnInit {
  @ViewChild('sf', { static: false }) sf!: SFComponent;
  @ViewChild('sf1', { static: false }) sf1!: SFComponent;
  @ViewChild('sf2', { static: false }) sf2!: SFComponent;
  record: any = {};
  i: any;
  ui: SFUISchema = {};
  ui2: SFUISchema = {};
  ui3: SFUISchema = {};
  schema: SFSchema = {};
  schema1: SFSchema = {};
  schema2: SFSchema = {};
  showCardFlag = false;
  showJopFlag = false;
  detailData: any = {
    identityInfoDTO: {},
    userDriverLicenseDTO: {},
    userPracticeSeniorityDTO: {}
  };
  companyData: any = {};
  constructor(
    private modal: NzModalRef,
    public service: UsermanageService,
    private envSrv: EAEnvironmentService,
    private eaCacheSrv: EACacheService
  ) {}

  ngOnInit(): void {
    this.companyData = this.eaCacheSrv.get(cacheConf.env);
    this.initSF();
  }
  initSF() {
    this.schema = {
      properties: {
        titleA: {
          title: '司机信息(必填）',
          type: 'string',
          ui: {
            widget: 'text'
          },
          default: '照片上传后会自动识别文字并填充下列内容栏'
        },
        mobile: {
          title: '手机号',
          type: 'string',
          format: 'mobile',
          maxLength: 11,
          ui: {
            widget: ''
          }
        },
        showName: {
          title: '身份证照片',
          type: 'string',
          readOnly: true,
          ui: {
            widget: 'textarea',
            borderless: true,
            showRequired: true
          },
          default: '请上传身份证原件的高清照片，若上传复印件，则需加盖公司印章及法人签字；上传后系统会自动识别并填写'
        },
        tipsA: {
          title: '',
          type: 'string',
          ui: {
            widget: 'custom',
            offsetControl: 6
          }
        },
        certificatePhotoFrontWatermark: {
          type: 'string',
          title: '',
          ui: {
            offsetControl: 6,
            action: apiConf.waterFileUpload,
            fileType: 'image/png,image/jpeg,image/jpg,image/gif',
            limit: 1,
            limitFileCount: 1,
            resReName: 'data.fullFileWatermarkPath',
            urlReName: 'data.fullFileWatermarkPath',
            widget: 'upload',
            descriptionI18n: '图片支持jpg、jpeg、png、gif格式，大小不超过2M',
            data: {
              appId: this.envSrv.env.appId
            },
            name: 'multipartFile',
            multiple: false,
            listType: 'picture-card',
            change: (args: any) => {
              if (args.type === 'success') {
                const avatar = [
                  {
                    uid: -1,
                    name: 'LOGO',
                    status: 'done',
                    url: args.file.response.data.fullFileWatermarkPath,
                    response: {
                      url: args.file.response.data.fullFileWatermarkPath
                    }
                  }
                ];
                this.sf?.setValue('/certificatePhotoFrontWatermark', avatar);
                this.detailData.certificatePhotoFront = args.file.response.data.fullFilePath;
                this.checkIdCard(args.file.response.data.fullFilePath, 'front', 0);
              }
            },
            beforeUpload: (file: any, _fileList: any) => {
              return new Observable((observer: Observer<boolean>) => {
                const isLt2M = file.size / 1024 / 1024 < 2;
                if (!isLt2M) {
                  this.service.msgSrv.warning('图片大小超过2M!');
                  observer.complete();
                  return;
                }
                observer.next(isLt2M);
                observer.complete();
              });
            }
            //  previewFile: (file: NzUploadFile) => of(file.url),
          }
        },
        tipsB: {
          title: '',
          type: 'string',
          ui: {
            widget: 'custom',
            offsetControl: 6
          }
        },
        certificatePhotoBackWatermark: {
          type: 'string',
          title: '',
          ui: {
            offsetControl: 6,
            action: apiConf.waterFileUpload,
            fileType: 'image/png,image/jpeg,image/jpg,image/gif',
            limit: 1,
            limitFileCount: 1,
            resReName: 'data.fullFileWatermarkPath',
            urlReName: 'data.fullFileWatermarkPath',
            widget: 'upload',
            descriptionI18n: '图片支持jpg、jpeg、png、gif格式，大小不超过2M',
            data: {
              appId: this.envSrv.env.appId
            },
            name: 'multipartFile',
            multiple: false,
            listType: 'picture-card',
            change: (args: any) => {
              if (args.type === 'success') {
                const avatar = [
                  {
                    uid: -1,
                    name: 'LOGO',
                    status: 'done',
                    url: args.file.response.data.fullFileWatermarkPath,
                    response: {
                      url: args.file.response.data.fullFileWatermarkPath
                    }
                  }
                ];
                this.sf?.setValue('/certificatePhotoBackWatermark', avatar);
                this.detailData.certificatePhotoBack = args.file.response.data.fullFilePath;
                this.checkIdCard(args.file.response.data.fullFilePath, 'back', 0);
              }
            },
            beforeUpload: (file: any, _fileList: any) => {
              return new Observable((observer: Observer<boolean>) => {
                const isLt2M = file.size / 1024 / 1024 < 2;
                if (!isLt2M) {
                  this.service.msgSrv.warning('图片大小超过2M!');
                  observer.complete();
                  return;
                }
                observer.next(isLt2M);
                observer.complete();
              });
            }
            //  previewFile: (file: NzUploadFile) => of(file.url),
          }
        },
        name: {
          title: '姓名',
          type: 'string',
          maxLength: 32,
          ui: {
            widget: '',
            placeholder: '请输入姓名'
          }
        },
        certificateNumber: {
          title: '身份证号',
          type: 'string',
          format: 'id-card',
          minLength: 1,
          maxLength: 18,
          ui: {
            widget: '',
            placeholder: '请输入法定代表人证件号',
            errors: {
              required: '请输入18位身份证号码'
            }
          }
        },
        bankCardNo: {
          title: '银行卡号',
          type: 'string',
          maxLength: 18,
          ui: {
            widget: '',
            placeholder: '请输入银行卡号'
            // change: (val: any) =>{
            //   const value =  val.replace(/\D/g,'')
            //   this.sf.setValue('/bankCardNo', value)
            // },
          },
          default: ''
        },
        bankName: {
          title: '开户行',
          type: 'string',
          ui: {
            widget: ''
          },
          default: ''
        },
        validStartTime: {
          title: '身份证有效期起',
          type: 'string',
          ui: {
            widget: 'date'
          }
        },
        validEndTime: {
          title: '身份证有效期止',
          type: 'string',
          ui: {
            widget: 'date',
            change: (val: any) => {
              if (val) {
                this.sf?.setValue('/isLongTime', false);
              }
            }
          }
        },
        isLongTime: {
          title: '长期',
          type: 'boolean',
          ui: {
            widget: 'checkbox',
            class: 'input-back',
            change: (val: any) => {
              if (val) {
                this.sf?.setValue('/validEndTime', Date);
              }
            }
          } as SFCheckboxWidgetSchema
        }
      },
      required: ['mobile', 'certificatePhotoFrontWatermark', 'certificatePhotoBackWatermark', 'name', 'certificateNumber', 'validStartTime',
      'validEndTime']
    };
    this.schema1 = {
      properties: {
        titleB: {
          title: '驾驶证信息(必填）',
          type: 'string',
          ui: {
            widget: 'text'
          },
          default: '照片上传后会自动识别文字并填充下列内容栏'
        },
        certificatePhotoWatermark: {
          type: 'string',
          title: '驾驶证照片',
          ui: {
            action: apiConf.waterFileUpload,
            fileType: 'image/png,image/jpeg,image/jpg,image/gif',
            limit: 1,
            limitFileCount: 1,
            resReName: 'data.fullFileWatermarkPath',
            urlReName: 'data.fullFileWatermarkPath',
            widget: 'upload',
            descriptionI18n: '请上传驾驶证照片，支持JPG、PNG格式，文件小于5M。照片信息缺失、拼凑、过度PS、模糊不清，都不会通过审核。',
            data: {
              appId: this.envSrv.env.appId
            },
            name: 'multipartFile',
            multiple: false,
            listType: 'picture-card',
            change: (args: any) => {
              if (args.type === 'success') {
                const avatar = [
                  {
                    uid: -1,
                    name: 'LOGO',
                    status: 'done',
                    url: args.file.response.data.fullFileWatermarkPath,
                    response: {
                      url: args.file.response.data.fullFileWatermarkPath
                    }
                  }
                ];
                this.sf1?.setValue('/certificatePhotoWatermark', avatar);
                this.detailData.userDriverLicenseDTO.certificatePhoto = args.file.response.data.fullFilePath;
                this.checkDriverCard(args.file.response.data.fullFilePath, 'front', 0);
              } else {
                this.detailData.userDriverLicenseDTO.certificatePhoto = '';
              }
            },
            beforeUpload: (file: any, _fileList: any) => {
              return new Observable((observer: Observer<boolean>) => {
                const isLt4M = file.size / 1024 / 1024 < 4;
                if (!isLt4M) {
                  this.service.msgSrv.warning('图片大小超过4M!');
                  observer.complete();
                  return;
                }
                observer.next(isLt4M);
                observer.complete();
              });
            }
            //  previewFile: (file: NzUploadFile) => of(file.url),
          }
        },
        roadImg: {
          title: '',
          type: 'boolean',
          // enum: [{ label: '长期', value: true }],
          ui: {
            widget: 'custom'
          }
        },
        licenseNo: {
          title: '驾驶证号',
          type: 'string',
          ui: {
            // widget: 'text',
            placeholder: '请输入'
          }
          // default: this.ar.snapshot.queryParams.licenseNo
        },
        driverModel: {
          title: '准驾车型',
          type: 'string',
          ui: {
            widget: 'select',
            mode: 'multiple',
            containsAllLabel: false,
            placeholder: '请选择准驾车型',
            asyncData: () =>
              this.service.request(this.service.$api_getDictValue, { dictKey: 'driverModel' }).pipe(
                map(data => {
                  return data.map((m: any) => {
                    return { label: m.label, value: m.label };
                  });
                })
              )
          }
        },
        validStartTime: {
          title: '有效期起',
          type: 'string',
          ui: {
            widget: 'date',
            format: 'yyyy-MM-dd',
            placeholder: '请选择',
            errors: {
              required: '请选择起始日期'
            },
            change: i => {}
          } as SFDateWidgetSchema
        },
        validEndTime: {
          title: '有效期止',
          type: 'string',
          ui: {
            widget: 'date',
            format: 'yyyy-MM-dd',
            placeholder: '请选择',
            errors: {
              required: '请选择终止日期'
            },
            change: i => {}
          } as SFDateWidgetSchema
        },
        signingOrganization: {
          title: '签发机关',
          type: 'string',
          maxLength: 30,
          ui: {
            // widget: this.detailData.commitFlag !== 0 ? 'text' : '',
            placeholder: '请输入'
          }
        }
      },
      required: ['certificatePhotoWatermark', 'licenseNo', 'driverModel', 'validStartTime', 'validEndTime']
    };
    this.schema2 = {
      properties: {
        titleC: {
          title: '从业资格证(选填）',
          type: 'string',
          ui: {
            widget: 'text'
          },
          default: '照片上传后会自动识别文字并填充下列内容栏'
        },
        certificatePhotoWatermark: {
          type: 'string',
          title: '',
          ui: {
            offsetControl: 6,
            action: apiConf.waterFileUpload,
            fileType: 'image/png,image/jpeg,image/jpg,image/gif',
            limit: 1,
            limitFileCount: 1,
            resReName: 'data.fullFilePath',
            urlReName: 'data.fullFilePath',
            widget: 'upload',
            descriptionI18n: '图片支持jpg、jpeg、png、gif格式，大小不超过5M',
            data: {
              appId: this.envSrv.env.appId
            },
            name: 'multipartFile',
            multiple: false,
            listType: 'picture-card',
            change: (args: any) => {
              if (args.type === 'success') {
                const avatar = [
                  {
                    uid: -1,
                    name: 'LOGO',
                    status: 'done',
                    url: args.file.response.data.fullFileWatermarkPath,
                    response: {
                      url: args.file.response.data.fullFileWatermarkPath
                    }
                  }
                ];
                this.sf2?.setValue('/certificatePhotoWatermark', avatar);
                this.detailData.userPracticeSeniorityDTO.certificatePhoto = args.file.response.data.fullFilePath;
                this.checkQualificationCertificate(args.file.response.data.fullFilePath);
              } else {
                this.detailData.userPracticeSeniorityDTO.certificatePhoto = '';
              }
            },
            beforeUpload: (file: any, _fileList: any) => {
              return new Observable((observer: Observer<boolean>) => {
                const isLt2M = file.size / 1024 / 1024 < 2;
                if (!isLt2M) {
                  this.service.msgSrv.warning('图片大小超过2M!');
                  observer.complete();
                  return;
                }
                observer.next(isLt2M);
                observer.complete();
              });
            }
            // previewFile: (file: NzUploadFile) => of()
          }
        },
        agreeImg: {
          title: '',
          type: 'boolean',
          // enum: [{ label: '长期', value: true }],
          ui: {
            widget: 'custom'
          }
        },
        licenseNo: {
          title: '从业资格证号',
          type: 'string',
          maxLength: 30,
          ui: {
            // widget: this.detailData.commitFlag !== 0 ? 'text' : '',
            placeholder: '请输入'
          }
        },
        regionCode: {
          title: '签发省份',
          type: 'string',
          ui: {
            widget: 'select',
            placeholder: '请选择',
            asyncData: () => this.getProvinceData()
          } as SFDateWidgetSchema
        },
        validStartTime: {
          title: '发证日期',
          type: 'string',
          ui: {
            widget: 'date',
            format: 'yyyy-MM-dd',
            placeholder: '请选择',
            errors: {
              required: '请选择起始日期'
            },
            change: i => {}
          } as SFDateWidgetSchema
        },
        validEndTime: {
          title: '有效期止',
          type: 'string',
          ui: {
            widget: 'date',
            format: 'yyyy-MM-dd',
            placeholder: '请选择',
            errors: {
              required: '请选择终止日期'
            },
            change: i => {}
          } as SFDateWidgetSchema
        }
      },
      required: []
    };
    this.ui = {
      '*': {
        spanLabelFixed: 180,
        grid: { span: 24 },
        width: 700
      },
      $title1: {
        spanLabelFixed: 0
      },
      $title2: {
        spanLabelFixed: 0
      },
      $title3: {
        spanLabelFixed: 0
      },
      $title4: {
        spanLabelFixed: 0
      },
      $enterpriseRegistrationTime: {
        width: 680
      },
      $operatingEndTime: {
        grid: { span: 9 }
      },
      $dateType: {
        grid: { span: 4 }
      },
      $validEndTime: {
        grid: { span: 9 }
      },
      $isLongTime: {
        spanLabelFixed: 30,
        grid: { xxl: 6, xl: 6, lg: 4, md: 6 }
      },
      $dateType01: {
        grid: { span: 4 }
      },
      $registrationCapital: {
        grid: { span: 12 }
      },
      $unit: {
        spanLabelFixed: 20,
        grid: { span: 3 }
      }
    };
    this.ui2 = {
      '*': {
        spanLabelFixed: 180,
        grid: { span: 18 },
        width: 600
      },
      $titleB: {
        grid: { span: 24 }
      },
      $certificatePhotoWatermark: {
        grid: { span: 12 }
      },
      $roadImg: {
        grid: { span: 4 },
        class: 'setCustom'
      }
    };
    this.ui3 = {
      '*': {
        spanLabelFixed: 180,
        grid: { span: 18 },
        width: 600
      },
      $titleC: {
        grid: { span: 24 }
      },
      $certificatePhotoWatermark: {
        grid: { span: 12 }
      },
      $agreeImg: {
        grid: { span: 4 },
        class: 'setCustom'
      }
    };
  }
  getRegionToThree() {
    // 获取一、二、三级地区详情
    this.service.http.post(this.service.$api_getRegionToThree).subscribe(res => {
      if (this.sf1) {
        this.sf1.getProperty('/enterpriseAddressCode')!.schema.enum = res.data;
        this.sf1?.getProperty('/enterpriseAddressCode')?.widget.reset(res.data);
      }
    });
  }
  getProvinceData() {
    return this.service.request(this.service.$api_getRegionByCode, { regionCode: '' }).pipe(
      map(res => {
        const result: any = [];
        if (res) {
          res.map((m: any) => {
            const item = { label: m.name, value: m.regionCode };
            result.push(item);
          });
        }
        return result;
      })
    );
  }
  checkIdCard(imgurl: any, side: any, type: any) {
    // 识别身份证 参数side：0-正面、1-背面；type：0-申请人身份证，1-法定代表人身份证
    const params = {
      idCardUrl: imgurl,
      side
    };
    this.service.request(this.service.$api_checkIdCard, params).subscribe(res => {
      if (res) {
        if (type === 0) {
          // 法定代表人身份证
          if (side === 'front') {
            // 正面
            this.sf.setValue('/name', res.name);
            this.sf.setValue('/certificateNumber', res.number);
      } else if (side === 'back') {
            // 反面
            this.sf.setValue('/validStartTime', res.validFrom);
            this.sf.setValue('/validEndTime', res.validTo);
          }
        }
      }
    });
  }
  checkQualificationCertificate(imgurl: any) {
    // 识别从业资格证 参数side：0-正面、1-背面；type：0-申请人身份证，1-法定代表人身份证
    const params = {
      qualificationCertificateUrl: imgurl
    };
    this.service.request(this.service.$api_recognizeQualificationCertificate, params).subscribe(res => {
      console.log(res);

      if (res) {
        this.sf2.setValue('/licenseNo', res.certificateNumber);
        this.sf2.setValue('/regionCode', res.addressRegionCodes?.[0]);
      }
    });
  }

  checkDriverCard(imgurl: any, side: any, type: any) {
    // 识别身份证 参数side：0-正面、1-背面；type：0-申请人身份证，1-法定代表人身份证
    const params = {
      driverLicenseUrl: imgurl,
      side
    };
    this.service.request(this.service.$api_recognizeDriverLicense, params).subscribe(res => {
      if (res) {
        if (type === 0) {
          // 法定代表人身份证
          if (side === 'front') {
            // 正面
            this.sf1.setValue('/licenseNo', res.number);
            this.sf1.setValue('/driverModel', [res.classType?.toUpperCase()]);
            this.sf1.setValue('/validStartTime', res.validFrom);
            this.sf1.setValue('/validEndTime', res.validTo);
            this.sf1.setValue('/signingOrganization', res.issuingAuthority);
          }
        }
      }
    });
  }
  close(): void {
    this.modal.destroy();
  }
  showExample() {
    this.showCardFlag = !this.showCardFlag;
  }
  showJopExample() {
    this.showJopFlag = !this.showJopFlag;
  }
  submitForm() {
    const startTime = new Date(this.sf.getValue('/validStartTime'));
    const endTime = new Date(this.sf.getValue('/validEndTime'));
    const isLongTime = this.sf.getValue('/isLongTime');
    if (!isLongTime && startTime > endTime) {
      this.service.msgSrv.warning('身份证有效开始日期必须大于有效截止日期');
      return;
    }
    const items: any = this.sf?.value;
    items.certificatePhotoFrontWatermark =
      this.sf?.value?.certificatePhotoFrontWatermark?.data?.fullFilePath || this.sf?.value?.certificatePhotoFrontWatermark;
    items.certificatePhotoBackWatermark =
      this.sf?.value?.certificatePhotoBackWatermark?.data?.fullFilePath || this.sf?.value?.certificatePhotoBackWatermark;
    const items2: any = this.sf1.value;
    items2.certificatePhotoWatermark =
      this.sf1.value?.certificatePhotoWatermark?.data?.fullFilePath || this.sf1.value?.certificatePhotoWatermark;
    const items3: any = this.sf2.value;
    items3.certificatePhotoWatermark =
      this.sf2.value?.certificatePhotoWatermark?.data?.fullFilePath || this.sf2.value?.certificatePhotoWatermark;
    const params: any = {
      source: 2,
      mobile: this.sf?.value.mobile,
      bankCardNo: this.sf?.value.bankCardNo,
      bankName: this.sf?.value.bankName,
      identityInfoDTO: {
        ...items,
        certificatePhotoFront: this.detailData.certificatePhotoFront,
        certificatePhotoBack: this.detailData.certificatePhotoBack
      },
      userDriverLicenseDTO: {
        ...items2,
        certificatePhoto: this.detailData.userDriverLicenseDTO.certificatePhoto
      },
      userPracticeSeniorityDTO: {
        ...items3,
        certificatePhoto: this.detailData.userPracticeSeniorityDTO.certificatePhoto
      }
    };
    if (params.userPracticeSeniorityDTO.certificatePhoto === '' || params.userPracticeSeniorityDTO.certificatePhotoWatermark === '') {
      delete params.userPracticeSeniorityDTO.certificatePhotoWatermark;
      delete params.userPracticeSeniorityDTO.certificatePhoto;
    }
    params.userDriverLicenseDTO.driverModel = params.userDriverLicenseDTO.driverModel.join(',');
    delete params.identityInfoDTO.showName;
    delete params.identityInfoDTO.titleA;
    delete params.userDriverLicenseDTO.titleB;
    delete params.userPracticeSeniorityDTO.titleC;
    delete params.userDriverLicenseDTO.tipsA;
    delete params.userPracticeSeniorityDTO.tipsC;
    if (JSON.stringify(params.userPracticeSeniorityDTO) === '{}') {
      params.userPracticeSeniorityDTO = null;
    }
    this.service.request(this.service.$api_driver_add, params).subscribe(res => {
      if (res) {
        this.service.msgSrv.success('添加成功');
        this.modal.close(true);
      }
    });
  }
}
